package org.example.erat.repository;

import org.example.erat.entity.ClassEntity;
import org.example.erat.entity.Course;
import org.example.erat.entity.Experiment;
import org.example.erat.entity.Report;
import org.example.erat.entity.Student;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * 实验报告数据访问接口
 */
@Repository
public interface ReportRepository extends JpaRepository<Report, Long> {

    /**
     * 根据学生和实验查找实验报告
     * @param student 学生对象
     * @param experiment 实验对象
     * @return 实验报告对象
     */
    Optional<Report> findByStudentAndExperiment(Student student, Experiment experiment);

    /**
     * 根据学生查找实验报告列表
     * @param student 学生对象
     * @return 实验报告列表
     */
    List<Report> findByStudent(Student student);

    /**
     * 根据实验查找实验报告列表
     * @param experiment 实验对象
     * @return 实验报告列表
     */
    List<Report> findByExperiment(Experiment experiment);

    /**
     * 根据文件名查找实验报告
     * @param fileName 文件名
     * @return 实验报告对象
     */
    Optional<Report> findByFileName(String fileName);

    /**
     * 统计某个实验的提交报告数量
     * @param experiment 实验对象
     * @return 提交报告数量
     */
    @Query("SELECT COUNT(r) FROM Report r WHERE r.experiment = ?1")
    Long countByExperiment(Experiment experiment);

    /**
     * 根据学生班级和实验课程查找实验报告列表
     * @param classEntity 班级对象
     * @param course 课程对象
     * @return 实验报告列表
     */
    @Query("SELECT r FROM Report r WHERE r.student.classEntity = ?1 AND r.experiment.course = ?2")
    List<Report> findByStudentClassEntityAndExperimentCourse(ClassEntity classEntity, Course course);
}
